package com.joey.concurrency.example.singleton;

import com.joey.concurrency.annotation.NotThreadSafe;
import com.joey.concurrency.annotation.ThreadSafe;

/**
 * 双重同步锁单例模式
 * @Author hyy
 **/
@NotThreadSafe
public class SingtonExample3 {

    private SingtonExample3(){ }
    //1.memory = allocate() 分配对象的内存空间
    //2.atorInstance() 初始化对象
    //3.instance = memory 设置其指向刚分配的内存

    //JVM和cpu优化，发生指令重排
   //描述，当A线程进入sync,指令顺序为132时，在完成3号操作后，线程B进行为null判断，发现其不为空（但实际未初始化完成），所以造成错误。
    //加上volatile ，则实现线程安全。volatile禁止重排序。
    private static SingtonExample3 instance = null;

    public static SingtonExample3 getInstance(){
        //双重检测机制+锁
        if (instance == null){
            synchronized (SingtonExample3.class){
                if(instance == null){
                    instance = new  SingtonExample3();
                }
            }
        }
        return instance;
    }
}
